package LambdaExpress;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

/**
 * 利用对数组的Sort来演示Lambdab表达式的使用
 * 对年龄进行排序
 */
public class Sort {
    /*对一个集合进行排序*/
    public static void main(String[] args) {
        Student[] students=getStudents();
        Comparator<Student> comparator=new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                //根据学生的年龄升序排序
                return o1.getAge()-o2.getAge();
            }
        };
        /***************************************************************
          Comparator<Student> comparator=new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
              return o1.getAge()-o2.getAge();
            }
          };

          可以替换为Lambdab表达式即：
          Comparator<Student> comparator=(o1,o2) -> o1.getAge() - o2.getAge();

          Lambda表达式是Java SE 8中引入的一个新特性
          使用Lambdab表达式需要的条件：
           1.JDK版本需在1.8或更高；
           2.Lambda表达式必须被函数式接口(Functional Interface)所支持，即该接口只包含一个抽象方法；
           3.Lambda表达式可以有零个、一个或多个参数；
           4.函数式接口中的抽象方法必须 [Network Error]

           使用时如果Lambdab指向内容只有一行则可以省略大括号，如果是直接的一行返回值
           则可以省略 return 以及大括号
        *****************************************************************/
        Comparator<Student> Newcomparator=(o1,o2) -> o1.getAge()- o2.getAge();
        Arrays.sort(students,Newcomparator);//调用comparator比较器进行排序
        SortTest(students);//调用方法打印每一位学生
    }

    /**
     * 生成随机的数组Student对象
     * @return 返回Student数组
     */
 public static Student[]/*返回数组*/ getStudents(){
     Student[] students=new Student[10];
     String[] grade={"一年级","二年级","三年级","四年级"};
     for (int i=0;i<10;i++){
         int age= (int)(Math.random()*10)+10;
         int gra=(int)(Math.random()*3);
         students[i]=new Student("stu"+(i+1),age,grade[gra]);

     }
   return students;
 }
 public static List<Student>/*返回数组*/ getStudentsList(){
     List<Student> list=new ArrayList<>();
     String[] grade={"一年级","二年级","三年级","四年级"};
     for (int i=0;i<10;i++){
         int age= (int)(Math.random()*10)+10;
         int gra=(int)(Math.random()*3);
        list.add(new Student("stu"+(i+1),age,grade[gra]));

     }
   return list;
 }


 public static void SortTest(Student[] arr){
     for (Student stu:arr) {
         System.out.println(stu);
     }
 }
}